/*
Alan
 * Created on 02-abr-2005 TODO To change the template for this generated file go to Window - Preferences - Java - Code Style - Code Templates
 */
package siac.metadatos.util;

import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;

import siac.metadatos.dto.CarpetaTematica;
import siac.metadatos.dto.ConjuntoDatos;
import siac.metadatos.logica.Constantes;

/**
 * @author Carlos Parra TODO To change the template for this generated type
 *         comment go to Window - Preferences - Java - Code Style - Code
 *         Templates
 */
public class ArbolCarpetas {
	public static final int ASIGNAR = 1;

	public static final int EDITAR = 2;

	public static final int ELIMINAR = 3;

	private int nivelMaximo = 4;

	private int consecutivo = 0;

	private int accion;

	private boolean showNombreConjunto;

	private Hashtable hsParametrosJSP;

	private String strPageHrefCarpeta;

	/*
	 * Identifica las carpetas asignadas a un usuario y se utiliza cuando esta
	 * clase es llamada para la generacion del arbol en el area de asignacion de
	 * carpetas
	 */
	private Vector vIdsCarpetasUsuario;

	/**
	 * @return Returns the showNombreConjunto.
	 */
	public boolean isShowNombreConjunto() {
		return showNombreConjunto;
	}

	/**
	 * @param showNombreConjunto
	 *            The showNombreConjunto to set.
	 */
	public void setShowNombreConjunto(boolean showNombreConjunto) {
		this.showNombreConjunto = showNombreConjunto;
	}

	/**
	 * Metodo encargado de dibujar un arbol con sus carpetas y conjuntos. A este
	 * metodo debe llegar la informacion completa de los modulos a mostrar en el
	 * arbol, en este caso carpetas y conjuntos.
	 * 
	 * @param vArbol
	 *            Vector
	 * @param strJSP
	 *            String
	 * @return String
	 */
	public String dibujarArbol(Vector vArbol, String strJSP, String parametro, int nivel) {
		String strArbol = "";
		if (vArbol == null)
			return strArbol;
		for (int i = 0; i < vArbol.size(); i++) {
			if (vArbol.elementAt(i) instanceof CarpetaTematica && ((CarpetaTematica) vArbol.elementAt(i)).getTipoModulo() != Constantes.MODULO_CONJUNTO_DATOS) {
				CarpetaTematica dtCarpeta = (CarpetaTematica) vArbol.elementAt(i);
				strArbol += "<tr>" + obtenerTds(nivel);
				strArbol += "<td valign=\"top\" colspan=\"100\">";
				strArbol += obtenerDescripcionCarpetaEncapsulada(dtCarpeta.getDescripcionCarpeta(), strJSP, dtCarpeta.getIdCarpeta(), (dtCarpeta.getVHijos() != null && dtCarpeta.getVHijos().size() > 0), dtCarpeta.isTieneHijos(), true, parametro);
				strArbol += "</td>" + (getAccion() == ASIGNAR ? obtenerTdsCheckFinales(11 - (dtCarpeta.getNivel() + 7), consecutivo, dtCarpeta.getIdCarpeta()) : "") + "</tr>";
				strArbol += dibujarArbol(dtCarpeta.getVHijos(), strJSP, parametro, nivel + 1);
			} else if (vArbol.elementAt(i) instanceof ConjuntoDatos || (vArbol.elementAt(i) instanceof CarpetaTematica && ((CarpetaTematica) vArbol.elementAt(i)).getTipoModulo() == Constantes.MODULO_CONJUNTO_DATOS)) {
				ConjuntoDatos dtConjunto = null;
				if (vArbol.elementAt(i) instanceof CarpetaTematica) {
					dtConjunto = new ConjuntoDatos((CarpetaTematica) vArbol.elementAt(i));
				} else {
					dtConjunto = (ConjuntoDatos) vArbol.elementAt(i);
				}
				strArbol += "<tr>" + obtenerTds(nivel);
				strArbol += "<td valign=\"top\" colspan=\"100\">";
				if (strJSP.toUpperCase().indexOf("CONJUNTO") >= 0) {
					strArbol += obtenerDescripcionCarpetaEncapsulada(dtConjunto.getDescripcionConjunto(), strJSP, dtConjunto.getIdConjunto(), false, false, false, parametro);
				} else {
					strArbol += obtenerDescripcionCarpetaEncapsulada(dtConjunto.getDescripcionConjunto(), "editarConjunto.jsp", dtConjunto.getIdConjunto(), false, false, false, parametro);
				}
				strArbol += "</td>" + (getAccion() == ASIGNAR ? obtenerTdsCheckFinales(11 - (dtConjunto.getNivel() + 7), consecutivo, dtConjunto.getIdConjunto()) : "") + "</tr>";
			}
			consecutivo++;
		}
		return strArbol;
	}

	/**
	 * Metodo encargado de dibujar un arbol con sus carpetas y conjuntos. A este
	 * metodo debe llegar la informacion completa de los modulos a mostrar en el
	 * arbol, en este caso carpetas y conjuntos.
	 * 
	 * @param vArbol
	 *            Vector
	 * @param strJSP
	 *            String
	 * @return String
	 */
	public String dibujarArbol(Vector vArbol, String strJSP) {
		String strArbol = "";
		if (vArbol == null)
			return strArbol;
		for (int i = 0; i < vArbol.size(); i++) {
			if (vArbol.elementAt(i) instanceof CarpetaTematica && ((CarpetaTematica) vArbol.elementAt(i)).getTipoModulo() != Constantes.MODULO_CONJUNTO_DATOS) {
				CarpetaTematica dtCarpeta = (CarpetaTematica) vArbol.elementAt(i);
				strArbol += "<tr>" + obtenerTds(dtCarpeta.getNivel());
				strArbol += "<td valign=\"top\" colspan=\"100\">";
				strArbol += obtenerDescripcionCarpetaEncapsulada(dtCarpeta.getDescripcionCarpeta(), strJSP, dtCarpeta.getIdCarpeta(), (dtCarpeta.getVHijos() != null && dtCarpeta.getVHijos().size() > 0), dtCarpeta.isTieneHijos(), true);
				strArbol += "</td>" + (getAccion() == ASIGNAR ? obtenerTdsCheckFinales(11 - (dtCarpeta.getNivel() + 7), consecutivo, dtCarpeta.getIdCarpeta()) : "") + "</tr>";
				strArbol += dibujarArbol(dtCarpeta.getVHijos(), strJSP);
			} else if (vArbol.elementAt(i) instanceof ConjuntoDatos || (vArbol.elementAt(i) instanceof CarpetaTematica && ((CarpetaTematica) vArbol.elementAt(i)).getTipoModulo() == Constantes.MODULO_CONJUNTO_DATOS)) {
				ConjuntoDatos dtConjunto = null;
				if (vArbol.elementAt(i) instanceof CarpetaTematica) {
					dtConjunto = new ConjuntoDatos((CarpetaTematica) vArbol.elementAt(i));
				} else {
					dtConjunto = (ConjuntoDatos) vArbol.elementAt(i);
				}
				strArbol += "<tr>" + obtenerTds(dtConjunto.getNivel());
				strArbol += "<td valign=\"top\" colspan=\"100\">";
				if (strJSP.toUpperCase().indexOf("CONJUNTO") >= 0) {
					strArbol += obtenerDescripcionCarpetaEncapsulada(dtConjunto.getDescripcionConjunto(), strJSP, dtConjunto.getIdConjunto(), false, false, false);
				} else {
					strArbol += obtenerDescripcionCarpetaEncapsulada(dtConjunto.getDescripcionConjunto(), "editarConjunto.jsp", dtConjunto.getIdConjunto(), false, false, false);
				}
				strArbol += "</td>" + (getAccion() == ASIGNAR ? obtenerTdsCheckFinales(11 - (dtConjunto.getNivel() + 7), consecutivo, dtConjunto.getIdConjunto()) : "") + "</tr>";
			}
			consecutivo++;
		}
		return strArbol;
	}

	/**
	 * 
	 * @param strDesCarpeta
	 *            String
	 * @param strJSP
	 *            String
	 * @param idCarpeta
	 *            int
	 * @param carpetaExtendidad
	 *            boolean
	 * @param tieneHijos
	 *            boolean
	 * @param isCarpeta
	 *            boolean
	 * @return String
	 */
	private String obtenerDescripcionCarpetaEncapsulada(String strDesCarpeta, String strJSP, int idCarpeta, boolean carpetaExtendidad, boolean tieneHijos, boolean isCarpeta, String parametro) {
		int tipoModulo = 0;
		String strEncapDescripcion = "<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">";
		strEncapDescripcion += "<tr>";
		if (strJSP.contains("arbolConjuntos")) {
			if (!isCarpeta)
				strEncapDescripcion += "<td valign=\"top\" width=\"38\" align=\"left\" background=\"images/lin_entreC.gif\"><a target=\"jspArbolConjuntos\" href=\"showMetadato.jsp?conjunto=" + idCarpeta;
			else
				strEncapDescripcion += "<td valign=\"top\" width=\"38\" align=\"left\" background=\"images/lin_entreC.gif\"><a href=\"" + strJSP + "?";
		} else {
			strEncapDescripcion += "<td valign=\"top\" width=\"38\" align=\"left\" background=\"images/lin_entreC.gif\"><a target=\"_parent\" href=\"" + strJSP + "?";
		}
		strEncapDescripcion += getParametrosJSP();
		if (isCarpeta) {
			tipoModulo = Constantes.MODULO_CARPETAS_TEMATICAS;
			if (parametro != null && !parametro.equalsIgnoreCase("null")) {
				strEncapDescripcion += "&mostrarParcial=true&jspTrabajando=" + strJSP + "&idCarpeta=" + idCarpeta + "\">";
			} else {
				strEncapDescripcion += "&jspTrabajando=" + strJSP + "&idCarpeta=" + idCarpeta + "\">";
			}
			if (carpetaExtendidad)
				strEncapDescripcion += "<img src=\"images/cerrar_carp.gif\"  border=\"0\"></a>";
			else {
				if (tieneHijos)
					strEncapDescripcion += "<img src=\"images/carpeta.gif\"  border=\"0\"></a>";
				else
					strEncapDescripcion += "<img src=\"images/carpeta_sin_hijos.gif\"  border=\"0\"></a>";
			}
		} else {
			tipoModulo = Constantes.MODULO_CONJUNTO_DATOS;
			if (!strJSP.contains("arbolConjuntos"))
				strEncapDescripcion += "&idConjunto=" + idCarpeta + "&nombreConjunto=" + strDesCarpeta;
			strEncapDescripcion += "\"><img src=\"images/icono_conjunto.gif\" border=\"0\"></a>";
		}
		if (strJSP.contains("arbolConjuntos")) {
			strEncapDescripcion += "</td><td colspan=\"100\"><font face=\"Verdana\" size=\"1\">" + strDesCarpeta + "</font></td>";
		} else {
			strEncapDescripcion += "</td><td colspan=\"100\"><font face=\"Verdana\" size=\"1\">" + obtenerLinkDescripcionCarpeta(idCarpeta, strDesCarpeta, tipoModulo) + "</font></td>";
		}
		strEncapDescripcion += "</tr>";
		strEncapDescripcion += "</table>";
		return strEncapDescripcion;
	}

	/**
	 * 
	 * @param nivel
	 *            int
	 * @return String
	 */
	private String obtenerTds(int nivel) {
		String strTds = "";
		for (int i = 0; i < nivel; i++) {
			strTds += "<td valign=\"top\" width=\"20\">&nbsp;</td>";
		}
		return strTds;
	}

	/**
	 * 
	 * @param cantidad
	 *            int
	 * @param consecutivoCarpeta
	 *            int
	 * @param idCarpeta
	 *            int
	 * @return String
	 */
	private String obtenerTdsCheckFinales(int cantidad, int consecutivoCarpeta, int idCarpeta) {
		String strTds = "";
		for (int i = 0; i < (cantidad - 1); i++) {
			strTds += "<td valign=\"top\" width=\"20\">&nbsp;</td>";
		}
		strTds += "<td valign=\"top\" width=\"5%\"><input name=\"carpeta\" ";
		strTds += "type=\"checkbox\" value=\"" + idCarpeta + "\"" + (usuarioTieneCarpeta(idCarpeta) ? " checked" : "") + ">";
		strTds += "</td>";
		return strTds;
	}

	/**
	 * 
	 * @param idCarpeta
	 *            int
	 * @return boolean
	 */
	public boolean usuarioTieneCarpeta(int idCarpeta) {
		if (vIdsCarpetasUsuario == null)
			vIdsCarpetasUsuario = new Vector();
		for (int i = 0; i < vIdsCarpetasUsuario.size(); i++) {
			Integer idCarpetaUsr = (Integer) vIdsCarpetasUsuario.elementAt(i);
			if (idCarpetaUsr.intValue() == idCarpeta)
				return true;
		}
		return false;
	}

	/**
	 * 
	 * @param strDesCarpeta
	 *            String
	 * @param strJSP
	 *            String
	 * @param idCarpeta
	 *            int
	 * @param carpetaExtendidad
	 *            boolean
	 * @param tieneHijos
	 *            boolean
	 * @param isCarpeta
	 *            boolean
	 * @return String
	 */
	private String obtenerDescripcionCarpetaEncapsulada(String strDesCarpeta, String strJSP, int idCarpeta, boolean carpetaExtendidad, boolean tieneHijos, boolean isCarpeta) {
		int tipoModulo = 0;
		String strEncapDescripcion = "<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">";
		strEncapDescripcion += "<tr>";
		if (strJSP.indexOf("arbolConjuntos") >= 0) {
			if (!isCarpeta)
				strEncapDescripcion += "<td valign=\"top\" width=\"38\" align=\"left\" background=\"images/lin_entreC.gif\"><a target=\"jspArbolConjuntos\" href=showMetadato.jsp?conjunto=" + idCarpeta + ">";
			else
				strEncapDescripcion += "<td valign=\"top\" width=\"38\" align=\"left\" background=\"images/lin_entreC.gif\"><a href=\"" + strJSP + "?";
		} else {
			strEncapDescripcion += "<td valign=\"top\" width=\"38\" align=\"left\" background=\"images/lin_entreC.gif\"><a target=\"_parent\" href=\"" + strJSP + "?";
		}
		strEncapDescripcion += getParametrosJSP();
		if (isCarpeta) {
			tipoModulo = Constantes.MODULO_CARPETAS_TEMATICAS;
			strEncapDescripcion += "&jspTrabajando=" + strJSP + "&idCarpeta=" + idCarpeta + "\">";
			if (carpetaExtendidad)
				strEncapDescripcion += "<img src=\"images/cerrar_carp.gif\"  border=\"0\"></a></td>";
			else {
				if (tieneHijos)
					strEncapDescripcion += "<img src=\"images/carpeta.gif\"  border=\"0\"></a></td>";
				else
					strEncapDescripcion += "<img src=\"images/carpeta_sin_hijos.gif\"  border=\"0\"></a></td>";
			}
		} else {
			tipoModulo = Constantes.MODULO_CONJUNTO_DATOS;
			if (strJSP.indexOf("arbolConjuntos") == -1)
				strEncapDescripcion += "&idConjunto=" + idCarpeta + "&nombreConjunto=" + strDesCarpeta + "\">";
			strEncapDescripcion += "<img src=\"images/icono_conjunto.gif\" border=\"0\"></a></td>";
		}
		if (strJSP.indexOf("arbolConjuntos") >= 0) {
			strEncapDescripcion += "<td><font face=\"Verdana\" size=\"1\">" + strDesCarpeta + "</font></td>";
		} else {
			strEncapDescripcion += "<td><font face=\"Verdana\" size=\"1\">" + obtenerLinkDescripcionCarpeta(idCarpeta, strDesCarpeta, tipoModulo) + "</font></td>";
		}
		strEncapDescripcion += "</tr>";
		strEncapDescripcion += "</table>";
		return strEncapDescripcion;
	}

	/**
	 * En este metodo se construye el link para una descripcion de modulo, en el
	 * caso que esta lo requiera. Ya que el link para el icono o imagen se
	 * construye en el metodo obtenerDescripcionCarpetaEncapsulada.
	 * 
	 * @param idCarpeta
	 *            int
	 * @param strDescripcion
	 *            String
	 * @param tipoModulo
	 *            int
	 * @return String
	 */
	private String obtenerLinkDescripcionCarpeta(int idCarpeta, String strDescripcion, int tipoModulo) {
		String strLink = "";
		if (getStrPageHrefCarpeta() != null && !getStrPageHrefCarpeta().trim().equals("") && tipoModulo == Constantes.MODULO_CARPETAS_TEMATICAS) {
			strLink = "<a href=\"" + getStrPageHrefCarpeta() + "?";
			String strNombreParametro = "";
			switch (getAccion()) {
			case EDITAR:
				strNombreParametro = "idCarpetaEditar";
				break;
			case ELIMINAR:
				strNombreParametro = "idCarpetaEliminar";
				break;
			default:
				strNombreParametro = "idCarpeta";
				break;
			}
			strLink += strNombreParametro + "=" + idCarpeta + "\">";
			strLink += strDescripcion + "</a>";
		} else {
			strLink = strDescripcion;
		}

		return strLink;
	}

	/**
	 * @return Returns the nivelMaximo.
	 */
	public int getNivelMaximo() {
		return nivelMaximo;
	}

	/**
	 * @return Returns the accion.
	 */
	public int getAccion() {
		return accion;
	}

	/**
	 * @param accion
	 *            The accion to set.
	 */
	public void setAccion(int accion) {
		this.accion = accion;
	}

	/**
	 * @return Returns the strPageHrefCarpeta.
	 */
	public String getStrPageHrefCarpeta() {
		return strPageHrefCarpeta;
	}

	/**
	 * @param strPageHrefCarpeta
	 *            The strPageHrefCarpeta to set.
	 */
	public void setStrPageHrefCarpeta(String strPageHrefCarpeta) {
		this.strPageHrefCarpeta = strPageHrefCarpeta;
	}

	/**
	 * @param idsCarpetasUsuario
	 *            The vIdsCarpetasUsuario to set.
	 */
	public void setVIdsCarpetasUsuario(Vector idsCarpetasUsuario) {
		vIdsCarpetasUsuario = idsCarpetasUsuario;
	}

	/**
	 * 
	 * @param strNombre
	 *            String
	 * @param strValor
	 *            String
	 */
	public void addParametroJSP(String strNombre, String strValor) {
		if (strNombre == null || strValor == null)
			return;
		if (hsParametrosJSP == null) {
			hsParametrosJSP = new Hashtable();
		}
		hsParametrosJSP.put(strNombre, strValor);
	}

	/**
	 * 
	 * @return String
	 */
	private String getParametrosJSP() {
		String strParametros = "";
		if (hsParametrosJSP != null && hsParametrosJSP.size() > 0) {
			for (Enumeration e = hsParametrosJSP.keys(); e.hasMoreElements();) {
				String nombreParametro = (String) e.nextElement();
				if (hsParametrosJSP.get(nombreParametro) != null)
					strParametros += nombreParametro + "=" + (String) hsParametrosJSP.get(nombreParametro) + "&";
			}
			strParametros = strParametros.substring(0, strParametros.length() - 1);
		}
		return strParametros;
	}
}
